<?php
/**
 * URI封装对象
 * 
 * @version $Id: IURI.php 312 2008-04-23 16:29:38Z iwind $
 * @package util.net
 * @since 0.0.3
 */
class IURI extends IObject {
	private $info = array();
	private $uri;
	
	/**
	 * 构造
	 *
	 * @param string $uri URI字符串
	 */
	public function __construct($uri) {
		$this->uri = $uri;
		$this->info = @parse_url($uri);
		if (!$this->info) {
			//再尝试一次
			if (strstr($uri, "?")) {
				list($url, $query) = explode("?", $this->uri, 2);
				$this->info = @parse_url($url);
				if (!$this->info) {
					throw new INetException("invalid uri '{$uri}'");
				}
				else {
					if (strstr($query, "#")) {
						list($query, $fragment) = explode("#", $query, 2);
						$this->info["query"] = $query;
						$this->info["fragment"] = $fragment;
					}
					else {
						$this->info["query"] = $query;
					}
				}
			}
			else {
				throw new INetException("invalid uri '{$uri}'");
			}
		}
	}
	
	/**
	 * 取得片段（锚点）
	 *
	 * @return string
	 */
	public function fragment() {
		return $this->value("fragment");
	}
	
	/**
	 * 取得host值
	 *
	 * @return string
	 */
	public function host() {
		return $this->value("host");	
	}
	
	/**
	 * 取得pass值
	 *
	 * @return string
	 */
	public function pass() {
		return $this->value("pass");	
	}
	
	/**
	 * 取得path值
	 *
	 * @return string
	 */	
	public function path() {
		return $this->value("path");
	}
	
	/**
	 * 取得port值
	 * 
	 * 从0.0.3起，如果没有指定端口，则返回80
	 *
	 * @return integer
	 */	
	public function port() {
		$port = $this->value("port");	
		if ($port == null) {
			$port = 80;
		}
		return $port;
	}
	
	/**
	 * 取得query值
	 *
	 * @return string
	 */	
	public function query() {
		return $this->value("query");
	}
	
	/**
	 * 取得scheme（协议）值
	 *
	 * @return string
	 */	
	public function scheme() {
		return $this->value("scheme");
	}
	
	/**
	 * 取得user值
	 *
	 * @return string
	 */	
	public function user() {
		return $this->value("user");
	}
	
	/**
	 * 取得一个名称对应的值
	 *
	 * @param string $name 名称
	 * @return string
	 */
	private function value($name) {
		if (isset($this->info[$name])) {
			return $this->info[$name];
		}
		return null;
	}
	
	/**
	 * 转化成字符串
	 *
	 * @return string
	 */
	public function __toString() {
		return $this->uri;
	}
}

?>